hogwarts <- read_csv("data/hogwarts_2025.csv")
## Rows: 560 Columns: 60
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): wandCore, sex, bloodStatus, house
## dbl (56): id, course, result, Defence against the dark arts exam, Flying exa...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Изучите сайт со списком расширений ggplot2. Подберите ранее не использовавшийся в лекциях и домашних заданиях пакет, опции которого вам показались любопытными для визуализации данных hogwarts. Используйте возможности данного пакета, проинтерпретируйте получившийся график и опишите, почему использованный инструментарий пакета показался вам интересным и полезным
df <- hogwarts %>%
clean_names() %>%
mutate(
house = fct_relevel(factor(house), "Gryffindor"),
sex = factor(sex),
blood_status = factor(blood_status)
) %>%
select(potions_exam, house, sex, blood_status, course) %>%
tidyr::drop_na()
mod_lm <- lm(
potions_exam ~ house + sex + blood_status + course,
data = df
)
p <- ggcoef_table(
mod_lm,
conf.level = 0.95,
show_p_values = TRUE,
add_reference_rows = TRUE,
variable_labels = c(
house = "House",
sex = "Sex",
blood_status = "Blood status",
course = "Course (numeric)"
)
)
p +
plot_annotation(
title = "Predictors of Potions exam score",
subtitle = "Linear regression \nPoints = β estimates; lines = 95% CI",
theme = theme(
plot.title.position = "plot",
plot.title = element_text(hjust = 0.5),
plot.subtitle= element_text(hjust = 0.5)
)
)
Для анализа факторов, влияющих на результаты экзамена по
Зельеварению, была использована линейная регрессия с категориальными
предикторами: факультет, пол, происхождение, материал палочки, а также
числовой переменной — год обучения.
Модель показала, что
единственным статистически значимым фактором является принадлежность к
факультету Слизерин: при прочих равных условиях средний балл студентов
этого факультета по Зельеварению примерно на 50 пунктов выше (β = 50.3,
p < 0.001), чем у студентов Гриффиндора (выбранного в качестве
референсной категории). Остальные факультеты не отличаются от
Гриффиндора и друг от друга по среднему баллу за Зельеварение, так же
как не выявлено значимых различий между студентами разного пола, года
обучения, происхождения и с разными материалами волшебных палочек.
Выбранный форест плот полезен для визуального представления
результатов регрессионного анализа, поскольку он наглядно демонстрирует
не только направление и величину эффектов, но и их статистическую
значимость. Более того, данный тип графика имеет неоспоримое прикладное
значение - он часто используется для визуализации результатов анализа
медицинских данных и мета-анализа.
Изучите информацию о графике treemap. Как вы полагаете, в чем его отличие от мозаик-плота? Исходя из структуры графика, предположите, в каких ситуациях лучше будет подходить treemap, а в каких – мозаик-плот. Создайте treemap на данных hogwarts. Вы вольны использовать любые дополнительные пакеты в этом задании. (3 б.)
df_treeplot <- hogwarts %>%
clean_names() %>%
mutate(
house = fct_infreq(house),
blood_status = factor(blood_status),
) %>%
group_by(house, blood_status) %>%
summarise(
n_students = n(),
avg_result = mean(result, na.rm = TRUE),
.groups = "drop"
)
ggplot(df_treeplot, aes(area = n_students, fill = avg_result,
label = paste(blood_status, "\n", n_students))) +
geom_treemap() +
geom_treemap_text(
reflow = TRUE,
place = "centre",
colour = "white",
size = 2.5,
grow = TRUE,
min.size = 2.5,
) +
facet_wrap(~ house) +
scale_fill_viridis_c(name = "Средний балл", option = "C") +
labs(
title = "Распределение студентов по факультетам и происхождению",
subtitle = "Площадь = кол-во студентов; цвет = средний былл",
x = NULL, y = NULL
) +
theme_minimal(base_size = 12) +
theme(
panel.grid = element_blank(),
strip.text = element_text(face = "bold", size = 11)
)
Мозаичный график — это тип составленной столбчатой
диаграммы, котоырй иллюстрирует количество наблюдений в каждой подгуппе,
пропорционатьно общему числу наблюдений в каждом уровне переменной.
Размерность по горизонтали и вертикали показывают долю пересечения двух
переменных. Похоже на визуальный аналог таблицы кростабуляции -
показывает структуру и взаимосвязь переменных.
Древовидный
график — удобно показывает иерархическую структуру и подкатегории
переменных.Для описания данных использует как площадь, так и цвет, плюс
фасетирование для стратифицирующей переменной. Хорошо показывает
составные части одного целого, разбивая всех учеников на факультеты, а
факультеты на группы по происхождению. Позволяет сравнить размер подрупп
чежду фасетированными субгруппыми (кол-во студентов разного
происхождения внутри каждого факультета), а так же оценить успеваемость
внутри этих подргупп.
Данный древовидный график отображает
распределение студентов разного происхождения на факультетах и различия
в их успеваемости. Большинство студентов на всех факультетах
представляют полукровки, меньшинство - маглорожденные. На факультете
Слизерин маглоржденные студенты не обучаются. Факультет Равенкло имеет
самую высокую успеваемость, тогда как Слизерин - самую низкую.Нельзя
сказать, что существут зависимось между происхождением и успеваемостью,
маглорожденные студенты имеют как высокие, так и низкие средние баллы.
То же самое справедливо для полукровок и чистокровных студентов.
Постройте “леденцовый график” (lollipop-plot) для количества набранных студентами 5-го курса баллов за весь учебный год (по оси ординат – id студента, по оси абсцисс – итоговый балл). Отсортируйте студентов в порядке убывания итогового балла. Раскрасьте точки на “леденцах” в зависимости от сердцевины волшебной палочки. Палочки с сердечной жилой дракона должны быть красного цвета, с пером феникса – желтого, с волосом единорога – серого. В этом задании вы можете использовать только основные пакеты tidyverse. (2 б.)
df_lollipop <- hogwarts %>%
clean_names() %>%
filter(course == 5) %>%
mutate(
wand_core = fct_recode(
wand_core,
"Dragon heartstring" = "dragon heartstring",
"Phoenix feather" = "phoenix feather",
"Unicorn hair" = "unicorn hair"
),
id = fct_reorder(as.factor(id), result, .desc = F)
)
ggplot(df_lollipop, aes(x = result, y = id, color = wand_core)) +
geom_segment(aes(x = 0, xend = result, y = id, yend = id),
linewidth = 0.6, color = "grey70") +
geom_point(size = 3) +
scale_color_manual(
values = c(
"Dragon heartstring" = "red",
"Phoenix feather" = "gold",
"Unicorn hair" = "grey50"
),
name = "Wand core"
) +
labs(
x = "Total score for the year",
y = "Student ID"
) +
theme_minimal(base_size = 12) +
theme(
legend.position = "top",
panel.grid.major.y = element_blank(),
axis.text.y = element_text(size = 7)
)
Леденцовый график показывает упорядоченое распределение
значений перемннлй, в данном случае - итогового балла за год,
полученного студентами с разным материалом сердцевины палочки. На
графике не видно систематического влияния материала рердцевины палочка
на успеваемость. Такой тип графика удобен для сравнения ранжированных
значений и одновременного отображения дополнительной категориальной
переменной.
Подробно (останавливаясь на каждом пункте, а не в общем) опишите, какие стороны графика и интерпретации (приводится ниже) вы считаете верными, и сделанными в соответствии с хорошими практиками, а какие – нет. Сделайте свой график, отвечающий на тот же исследовательский вопрос, но лишенный технических и интерпретационных недостатков оригинала (если вы таковые нашли и упомянули).
students_long <- hogwarts %>%
pivot_longer(starts_with("week"),
names_to = "week_number",
values_to = "score") %>%
mutate(
week_number = str_split_i(week_number, "_", 2),
week_number = as.numeric(week_number)
)
ggplot(students_long) +
geom_line(aes(x = week_number, y = score, group = id))+
labs(
title = "Успеваемость студентов по неделям",
x = "Неделя",
y = "Набранный за неделю балл"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 200, face = "bold", hjust = 0.5),
plot.subtitle = element_text(size = 134, hjust = 0.5),
axis.title.x = element_text(size = 134, face = "bold"),
axis.title.y = element_text(size = 134, face = "bold"),
axis.text = element_text(size = 132)
)